jetcrab\parser\expressions/
arithmetic.rs1use crate::ast::{BinaryExpression, Node};
2use crate::parser::error::ParseResult;
3use crate::parser::Parser;
4
5impl Parser {
6 pub fn parse_additive_expression(&mut self) -> ParseResult<Node> {
7 let mut left = self.parse_multiplicative_expression()?;
8
9 while self.is_additive_operator() {
10 let operator = self.current_token_string();
11 self.advance();
12 let right = Box::new(self.parse_multiplicative_expression()?);
13
14 let span = self.create_span_from_tokens();
15 left = Node::BinaryExpression(BinaryExpression {
16 left: Box::new(left),
17 operator,
18 right,
19 span: Some(span),
20 });
21 }
22
23 Ok(left)
24 }
25
26 pub fn parse_multiplicative_expression(&mut self) -> ParseResult<Node> {
27 let mut left = self.parse_exponentiation_expression()?;
28
29 while self.is_multiplicative_operator() {
30 let operator = self.current_token_string();
31 self.advance();
32 let right = Box::new(self.parse_exponentiation_expression()?);
33
34 let span = self.create_span_from_tokens();
35 left = Node::BinaryExpression(BinaryExpression {
36 left: Box::new(left),
37 operator,
38 right,
39 span: Some(span),
40 });
41 }
42
43 Ok(left)
44 }
45
46 pub fn parse_exponentiation_expression(&mut self) -> ParseResult<Node> {
47 let mut left = self.parse_unary_expression()?;
48
49 while self.is_exponentiation_operator() {
50 let operator = self.current_token_string();
51 self.advance();
52 let right = Box::new(self.parse_exponentiation_expression()?);
53
54 let span = self.create_span_from_tokens();
55 left = Node::BinaryExpression(BinaryExpression {
56 left: Box::new(left),
57 operator,
58 right,
59 span: Some(span),
60 });
61 }
62
63 Ok(left)
64 }
65}